# coding:utf-8
'''
Created on 2011-3-21
sys.argv：每个传递给程序的命令行参数都在sys.argv中，而它仅仅是一个列表。
@author: Administrator
'''

import sys
import getopt

#===============================
# sys.argv用来接收简单的参数
#===============================
for arg in sys.argv:
    print arg
    
#===============================
# getopt用来接收复杂的参数。
# getopt.getopt函数接收三个参数。
# 第一个参数只不过是一个命令行标志和参数的原始列表（不包括第一个元素 - 脚本名称）。
# 第二个参数是脚本接收的短命令标志的一个列表（短命令如：-h、-g），如下面的例子中'hg:d'表示可以接收：
# -h：打印帮助信息
# -g...：使用给定的语法文件或URL
# -d：是否显示调试信息
# 其中-h和-d只是简单的独立标志（即后面不用跟参数，直接-h或-d即可），但是-g必须
# 跟随一些参数（“g:”中的“:”表示-g必须跟随参数）
# 第三个参数是脚本接收长命令标志的一个列表（长命令如：--help、--debug）。
# 长命令标识如果要求有参数是使用=号标识（如grammar=）与短命令中的“:”同理。
#
# 注：所有命令行中的长命令标志必须以两个短划线开始（如：--help），短命令以一个短
# 划线开始（如：-h）
#===============================
def main(args):
    grammar = 'demo.xml' # 默认值，如果没有在命令行中指定grammar，则使用此grammar
    try:
        opts, args = getopt.getopt(args, "hg:d", ["help", "grammar="])
    except getopt.GetoptError:
        print '输入参数不合法！' # 如果不能解析用户传入的参数，则给用户提示信息。
        sys.exit(2)
    for opt, arg in opts: # 从getopt取回的opts变量是一个由元组（flag和argument）组成的列表。
        if opt in ('-h', '--help'): # getopt不会在短命令和长命令之间自动转换，需要自己来判断
            print '帮助信息'
            sys.exit()
        elif opt == '-d':
            global _debug
            _debug = 1
            print 'Debug model'
        elif opt in ('-g', '--grammar'):
            grammar = arg
    
    source = ''.join(args)
    print source, grammar

main(sys.argv[1:])
